package comunicacion;

import java.io.BufferedReader;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import menu.mensajero.Mensaje;
import menu.mensajero.Mensajero;

/**
 * Clase que se encarga de recibir asincronicamente los mensajes desde el servidor
 * @author Camilo
 * @version $Id: Comunicacion.java 21 2010-09-29 20:34:00Z lopezandres2002@hotmail.com $
 */
public class ThreadRecibirServidor extends Thread
{

    //---------------------------------------
    // Atributos
    //---------------------------------------
    /**
     * Atributo que representa la linea de entrada desde el servidor
     */
    private BufferedReader entrada;
    /**
     * Atributo que representa el chat entre mesas
     */
    private Mensajero mensajero;

    //---------------------------------------
    // Constructor
    //---------------------------------------
    /**
     * Constructor del thread que recibe asincronicamente los mensaje desde el servidor
     * @param entradaServidor - BufferedReader desde el servidor
     * @param msjr - Instancia del chat usada en el menú
     */
    public ThreadRecibirServidor( BufferedReader entradaServidor, Mensajero msjr )
    {
        entrada = entradaServidor;
        mensajero = msjr;
    }

    //---------------------------------------
    // Getters y Setters
    //---------------------------------------
    //---------------------------------------
    // Métodos
    //---------------------------------------
    //---------------------------------------
    // Métodos Override
    //---------------------------------------
    /**
     * Metodo que inicia el hilo de escucha desde el servidor y toma acciones
     * dependiendo del mensaje recibido y del protocolo
     */
    @Override
    public void run()
    {
        String mensaje = "";
        while( true ) {
            try {
                mensaje = entrada.readLine();
                if( mensaje.startsWith( "MENSAJE" ) ) {
                    // Formato MENSAJE::Autor::Destino::Contenido del mensaje::Fecha de envio separada por comas con el formato siguiente
                    // (year - the year minus 1900. month - the month between 0-11. date - the day of the month between 1-31. hrs - the hours between 0-23. min - the minutes between 0-59. sec - the seconds between 0-59)
                    String[] contenido = mensaje.split( "::" );

                    try {
                        // Intenta darle el formato
                        Date fecha = ManejadorFormatoFechas.formatoFechaMensajero.parse( contenido[4] );
                        Mensaje msj = new Mensaje();
                        msj.setAutor( contenido[1] );
                        msj.setContenido( contenido[3] );
                        msj.setFecha( fecha );
                        mensajero.agregarNuevoMensajeRecibido( msj );
                    } catch( ParseException ex ) {
                        // No debería pasar
                        Logger.getLogger( ThreadRecibirServidor.class.getName() ).log( Level.SEVERE, null, ex );
                    }
                }
            } catch( IOException e ) {
                System.out.println( e.getMessage() );
            }
        }
    }
}
